package com.uniflow.mapper;

import com.uniflow.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 用户数据访问层
 * 
 * @author uniflow
 * @since 1.0.0
 */
@Mapper
public interface UserMapper {
    
    /**
     * 根据ID查询用户
     */
    User selectById(@Param("id") String id);
    
    /**
     * 根据用户名查询用户
     */
    User selectByUsername(@Param("username") String username);
    
    /**
     * 根据邮箱查询用户
     */
    User selectByEmail(@Param("email") String email);
    
    /**
     * 根据外部ID和同步源查询用户
     */
    User selectByExternalId(@Param("externalId") String externalId, @Param("syncSource") String syncSource);
    
    /**
     * 查询用户列表（分页）
     */
    List<User> selectList(@Param("orgId") String orgId, 
                         @Param("status") Integer status, 
                         @Param("keyword") String keyword);
    
    /**
     * 查询用户总数
     */
    Long selectCount(@Param("orgId") String orgId, 
                    @Param("status") Integer status, 
                    @Param("keyword") String keyword);
    
    /**
     * 根据组织ID查询用户列表
     */
    List<User> selectByOrgId(@Param("orgId") String orgId);
    
    /**
     * 根据角色ID查询用户列表
     */
    List<User> selectByRoleId(@Param("roleId") String roleId);
    
    /**
     * 插入用户
     */
    int insert(User user);
    
    /**
     * 批量插入用户
     */
    int insertBatch(@Param("users") List<User> users);
    
    /**
     * 更新用户
     */
    int updateById(User user);
    
    /**
     * 更新用户状态
     */
    int updateStatus(@Param("id") String id, @Param("status") Integer status);
    
    /**
     * 更新用户密码
     */
    int updatePassword(@Param("id") String id, @Param("passwordHash") String passwordHash);
    
    /**
     * 更新最后同步时间
     */
    int updateLastSyncAt(@Param("id") String id);
    
    /**
     * 根据ID删除用户
     */
    int deleteById(@Param("id") String id);
    
    /**
     * 批量删除用户
     */
    int deleteBatch(@Param("ids") List<String> ids);
    
    /**
     * 检查用户名是否存在
     */
    boolean existsByUsername(@Param("username") String username, @Param("excludeId") String excludeId);
    
    /**
     * 检查邮箱是否存在
     */
    boolean existsByEmail(@Param("email") String email, @Param("excludeId") String excludeId);
    
    /**
     * 查询用户及其角色信息
     */
    User selectWithRoles(@Param("id") String id);
    
    /**
     * 查询用户及其组织信息
     */
    User selectWithOrganization(@Param("id") String id);
}